package com.vivo.module.criteria.config;

import com.vivo.module.criteria.CriteriaValidator;
import com.vivo.module.criteria.PublicCriteriaMetaData;
import com.vivo.module.criteria.SimpleCriteriaMetaData;


/**
 * Public Order MetaData Config.
 * 
 * @author vivo
 * @date 2007-12-12
 * @param <V> -
 *            Value type.
 */
public class OrderMeta<V> extends PublicCriteriaMetaData<V> {

	public OrderMeta(String key) {
		super(key);
	}

	public OrderMeta(String key, CriteriaValidator<V> validator) {
		super(key, validator);
	}

	/**
	 * 使用方法：<BR>
	 * 如果<code>xxMeta< T ></code>中 T 的类型为自定义类型，例如此处的 class OrderAZ，<BR>
	 * 应该Override getValue() 方法。并按照本类中的方法对返回的值进行处理。
	 */
	public static OrderMeta<OrderAZ> order = new OrderMeta<OrderAZ>("order");
	@SuppressWarnings("unchecked")
    public static OrderMeta<SimpleCriteriaMetaData> orderby = new OrderMeta<SimpleCriteriaMetaData>(
	        "offset");

	/* 使用自定义类型时需要重写此方法 */
	@Override
	public V getValue() {
		Object o = super.getValue();
		if (o instanceof OrderAZ) {
			return (V) ((OrderAZ) o).getOrder();
		} else if (o instanceof SimpleCriteriaMetaData) {
			return (V) ((SimpleCriteriaMetaData) o).getKey();
		}
		return super.getValue();
	}
	
	/*
	 * Constants. 自定义类型用的常数
	 */
	public static OrderAZ asc = new OrderAZ("asc");
	public static OrderAZ desc = new OrderAZ("desc");

	/* 自定义类型 */
	/**
	 * Order A-Z class
	 */
	public static class OrderAZ {
		private String order = "desc";

		public OrderAZ(String order) {
			this.order = order;
		}

		public String getOrder() {
			return this.order;
		}
	}

}
